﻿using System;
using System.Text;

namespace ESoft.Extensions {
    /// <summary>
    /// 日期扩展 
    /// </summary>
    public static partial class Extension {
        /// <summary>
        /// 获取格式化字符串，年月，格式："yyyyMM"
        /// </summary>
        /// <param name="dateTime">日期</param>
        public static string ToYearMonthString(this DateTime dateTime) {
            return $"{dateTime:yyyyMM}";
        }

        /// <summary>
        /// 获取格式化字符串，年月日，格式："yyyyMMdd"
        /// </summary>
        /// <param name="dateTime">日期</param>
        public static string ToYearMonthDayString(this DateTime dateTime) {
            return $"{dateTime:yyyyMMdd}";
        }

        /// <summary>
        /// 获取格式化字符串，年月日时分秒毫秒，格式："yyMMddHHmmssfff"
        /// </summary>
        /// <param name="dateTime">日期</param>
        /// <param name="isRemoveMillisecond">是否移除毫秒</param>
        public static string ToDateTimeAllString(this DateTime dateTime, bool isRemoveMillisecond = false) {
            if (isRemoveMillisecond)
                return $"{dateTime:yyMMddHHmmss}";

            return $"{dateTime:yyMMddHHmmssfff}";
        }

        /// <summary>
        /// 获取格式化字符串，带时分秒，格式："yyyy-MM-dd HH:mm:ss"
        /// </summary>
        /// <param name="dateTime">日期</param>
        /// <param name="isRemoveSecond">是否移除秒</param>
        public static string ToDateTimeString(this DateTime dateTime, bool isRemoveSecond = false) {
            if (isRemoveSecond)
                return $"{dateTime:yyyy-MM-dd HH:mm}";

            return $"{dateTime:yyyy-MM-dd HH:mm:ss}";
        }

        /// <summary>
        /// 获取格式化字符串，带时分秒，格式："yyyy-MM-dd HH:mm:ss"
        /// </summary>
        /// <param name="dateTime">日期</param>
        /// <param name="isRemoveSecond">是否移除秒</param>
        public static string ToDateTimeString(this DateTime? dateTime, bool isRemoveSecond = false) {
            if (dateTime == null)
                return string.Empty;

            return ToDateTimeString(dateTime.Value, isRemoveSecond);
        }

        /// <summary>
        /// 获取格式化字符串，不带时分秒，格式："yyyy-MM-dd"
        /// </summary>
        /// <param name="dateTime">日期</param>
        public static string ToDateString(this DateTime dateTime) {
            return $"{dateTime:yyyy-MM-dd}";
        }

        /// <summary>
        /// 获取格式化字符串，不带时分秒，格式："yyyy-MM-dd"
        /// </summary>
        /// <param name="dateTime">日期</param>
        public static string ToDateString(this DateTime? dateTime) {
            if (dateTime == null)
                return string.Empty;

            return ToDateString(dateTime.Value);
        }

        /// <summary>
        /// 获取格式化字符串，不带年月日，格式："HH:mm:ss"
        /// </summary>
        /// <param name="dateTime">日期</param>
        public static string ToTimeString(this DateTime dateTime) {
            return $"{dateTime:HH:mm:ss}";
        }

        /// <summary>
        /// 获取格式化字符串，不带年月日，格式："HH:mm:ss"
        /// </summary>
        /// <param name="dateTime">日期</param>
        public static string ToTimeString(this DateTime? dateTime) {
            if (dateTime == null)
                return string.Empty;

            return ToTimeString(dateTime.Value);
        }

        /// <summary>
        /// 获取格式化字符串，带毫秒，格式："yyyy-MM-dd HH:mm:ss.fff"
        /// </summary>
        /// <param name="dateTime">日期</param>
        public static string ToMillisecondString(this DateTime dateTime) {
            return $"{dateTime:yyyy-MM-dd HH:mm:ss.fff}";
        }

        /// <summary>
        /// 获取格式化字符串，带毫秒，格式："yyyy-MM-dd HH:mm:ss.fff"
        /// </summary>
        /// <param name="dateTime">日期</param>
        public static string ToMillisecondString(this DateTime? dateTime) {
            if (dateTime == null)
                return string.Empty;

            return ToMillisecondString(dateTime.Value);
        }

        /// <summary>
        /// 获取格式化字符串，不带时分秒，格式："yyyy年MM月dd日"
        /// </summary>
        /// <param name="dateTime">日期</param>
        public static string ToChineseDateString(this DateTime dateTime) {
            return $"{dateTime.Year}年{dateTime.Month}月{dateTime.Day}日";
        }

        /// <summary>
        /// 获取格式化字符串，不带时分秒，格式："yyyy年MM月dd日"
        /// </summary>
        /// <param name="dateTime">日期</param>
        public static string ToChineseDateString(this DateTime? dateTime) {
            if (dateTime == null)
                return string.Empty;

            return ToChineseDateString(dateTime.SafeValue());
        }

        /// <summary>
        /// 获取格式化字符串，带时分秒，格式："yyyy年MM月dd日 HH时mm分"
        /// </summary>
        /// <param name="dateTime">日期</param>
        /// <param name="isRemoveSecond">是否移除秒</param>
        public static string ToChineseDateTimeString(this DateTime dateTime, bool isRemoveSecond = false) {
            var result = new StringBuilder();

            result.AppendFormat("{0}年{1}月{2}日", dateTime.Year, dateTime.Month, dateTime.Day);
            result.AppendFormat(" {0}时{1}分", dateTime.Hour, dateTime.Minute);
            if (isRemoveSecond == false) result.AppendFormat("{0}秒", dateTime.Second);

            return result.ToString();
        }

        /// <summary>
        /// 获取格式化字符串，带时分秒，格式："yyyy年MM月dd日 HH时mm分"
        /// </summary>
        /// <param name="dateTime">日期</param>
        /// <param name="isRemoveSecond">是否移除秒</param>
        public static string ToChineseDateTimeString(this DateTime? dateTime, bool isRemoveSecond = false) {
            if (dateTime == null)
                return string.Empty;

            return ToChineseDateTimeString(dateTime.Value);
        }
    }
}